class Bowl {
    Bowl(int marker) {
        System.out.println("Bowl(" + marker + ")");
    }

    void bowl_method(int marker) {
        System.out.println("bowl_method(" + marker + ")");
    }
}

class Table {
    static Bowl bowl1 = new Bowl(1);

    Table() {
        System.out.println("Table()");
        bowl2.bowl_method(1);
    }

    void table_method(int marker) {
        System.out.println("table_method(" + marker + ")");
    }

    static Bowl bowl2 = new Bowl(2);
}

class Cupboard {
    Bowl bowl3 = new Bowl(3);
    static Bowl bowl4 = new Bowl(4);

    Cupboard() {
        System.out.println("Cupboard()");
        bowl4.bowl_method(2);
    }

    void cupboard_method(int marker) {
        System.out.println("cupboard_method(" + marker + ")");
    }

    static Bowl bowl5 = new Bowl(5);
}


public class StaticInitialization {
    public static void main(String[] args) {
        System.out.println("Creating new Cupboard() in main");
        new Cupboard();
        System.out.println("Creating new Cupboard() in main");
        new Cupboard();
        table.table_method(11);
        cupboard.cupboard_method(22);
    }

    static Table table = new Table();
    static Cupboard cupboard = new Cupboard();
}

/*
static初始化仅在必要时发生。如果不创建Table对象并且也不引用Table.bowl1或Table.bowl2，
则Bowl类型的静态字段bowl1和bowl2永远都不会被创建。
它们仅在第一个Table对象创建（或第一次访问静态数据）时被初始化。
之后，这些静态对象不会被重新初始化。

初始化的顺序是从静态字段开始（如果它们还没有被先前的对象创建触发初始化的话），然后是非静态字段。
静态初始化只在class对象首次加载时发生一次。
 */